/*
   程序名称：bkipc.h
   程序内容：与共享内存、文件锁、信号量有关的函数
   程序作者：姚杰
   完成日期：2012 年 07 月 01 日
*/

#ifndef USR_BKIPC_H_
#define USR_BKIPC_H_

#include "bkbase.h"

#include <sys/ipc.h>

#ifdef __cplusplus
extern "C" {
#endif

/* 创建共享内存 */
extern int BkCreateShm(key_t key, size_t size, int perms);

/* 删除共享内存 */
extern int BkRemoveShm(key_t key);

/* 连接到共享内存 */
extern char *BkAttachShm(key_t key);

/* 撤除与共享内存的连接 */
extern int BkDetachShm(char *p);

/* 创建信号量 */
extern int BkCreateSem(key_t key, int semval, int perms);

/* 删除信号量 */
extern int BkRemoveSem(key_t key);

/* 获得信号量的当前值 */
extern int BkGetSemNum(key_t key);

/* 对于信号量的 P 操作 */
extern int BkDijkstra_P(key_t key);

/* 对于信号量的 V 操作 */
extern int BkDijkstra_V(key_t key);

/* 打开锁文件，返回文件描述符。失败返回 -1 */
extern int BkOpenLockFile(const char *FileName);

/* 设置文件锁（读锁），文件偏移从文件头开始计算。返回 -2 表示超时、
   -3 表示被信号中断、-4 表示检测到死锁、-1 表示其他错误 */
extern int BkReadLock(int fd, int offset, int len, int TimeOut);

/* 设置文件锁（写锁），文件偏移从文件头开始计算。返回 -2 表示超时、
   -3 表示被信号中断、-4 表示检测到死锁、-1 表示其他错误 */
extern int BkWriteLock(int fd, int offset, int len, int TimeOut);

/* 释放文件锁 */
extern int BkUnlock(int fd, int offset, int len);

#ifdef __cplusplus
}
#endif

#endif
